{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Applying Functions and Plotting in Pandas\n",
"
\n",
"\n",
"In this section, we will answer the question:\n",
"\n",
"**Can we use the last letter of a name to predict the sex of the baby?**\n",
"\n",
"Here's the Baby Names dataset once again:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Name
\n",
"
Sex
\n",
"
Count
\n",
"
Year
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Mary
\n",
"
F
\n",
"
9217
\n",
"
1884
\n",
"
\n",
"
\n",
"
1
\n",
"
Anna
\n",
"
F
\n",
"
3860
\n",
"
1884
\n",
"
\n",
"
\n",
"
2
\n",
"
Emma
\n",
"
F
\n",
"
2587
\n",
"
1884
\n",
"
\n",
"
\n",
"
3
\n",
"
Elizabeth
\n",
"
F
\n",
"
2549
\n",
"
1884
\n",
"
\n",
"
\n",
"
4
\n",
"
Minnie
\n",
"
F
\n",
"
2243
\n",
"
1884
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Name Sex Count Year\n",
"0 Mary F 9217 1884\n",
"1 Anna F 3860 1884\n",
"2 Emma F 2587 1884\n",
"3 Elizabeth F 2549 1884\n",
"4 Minnie F 2243 1884"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"baby = pd.read_csv('babynames.csv')\n",
"baby.head()\n",
"# the .head() method outputs the first five rows of the DataFrame"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Breaking the Problem Down**\n",
"\n",
"Although there are many ways to see whether prediction is possible, we will use plotting in this section. We can decompose this question into two steps:\n",
"\n",
"1. Compute the last letter of each name.\n",
"1. Group by the last letter and sex, aggregating on Count.\n",
"1. Plot the counts for each sex and letter."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Apply\n",
"\n",
"\n",
"`pandas` Series contain an `.apply()` method that takes in a function and applies it to each value in the Series."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 4\n",
"1 4\n",
"2 4\n",
"3 9\n",
"4 6\n",
" ..\n",
"1891889 5\n",
"1891890 5\n",
"1891891 5\n",
"1891892 6\n",
"1891893 8\n",
"Name: Name, Length: 1891894, dtype: int64"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"names = baby['Name']\n",
"names.apply(len)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To extract the last letter of each name, we can define our own function to pass into `.apply()`:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 y\n",
"1 a\n",
"2 a\n",
"3 h\n",
"4 e\n",
" ..\n",
"1891889 s\n",
"1891890 y\n",
"1891891 a\n",
"1891892 e\n",
"1891893 p\n",
"Name: Name, Length: 1891894, dtype: object"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def last_letter(string):\n",
" return string[-1]\n",
"\n",
"names.apply(last_letter)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## String Manipulation\n",
"\n",
"\n",
"Although `.apply()` is flexible, it is often faster to use the built-in string manipulation functions in `pandas` when dealing with text data.\n",
"\n",
"`pandas` provides access to string manipulation functions using the `.str` attribute of Series."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 4\n",
"1 4\n",
"2 4\n",
"3 9\n",
"4 6\n",
" ..\n",
"1891889 5\n",
"1891890 5\n",
"1891891 5\n",
"1891892 6\n",
"1891893 8\n",
"Name: Name, Length: 1891894, dtype: int64"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"names = baby['Name']\n",
"names.str.len()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can directly slice out the last letter of each name in a similar way."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 y\n",
"1 a\n",
"2 a\n",
"3 h\n",
"4 e\n",
" ..\n",
"1891889 s\n",
"1891890 y\n",
"1891891 a\n",
"1891892 e\n",
"1891893 p\n",
"Name: Name, Length: 1891894, dtype: object"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"names.str[-1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We suggest looking at the docs for the full list of string methods ([link](https://pandas.pydata.org/pandas-docs/stable/text.html)).\n",
"\n",
"We can now add this column of last letters to our `baby` DataFrame."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Name
\n",
"
Sex
\n",
"
Count
\n",
"
Year
\n",
"
Last
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Mary
\n",
"
F
\n",
"
9217
\n",
"
1884
\n",
"
y
\n",
"
\n",
"
\n",
"
1
\n",
"
Anna
\n",
"
F
\n",
"
3860
\n",
"
1884
\n",
"
a
\n",
"
\n",
"
\n",
"
2
\n",
"
Emma
\n",
"
F
\n",
"
2587
\n",
"
1884
\n",
"
a
\n",
"
\n",
"
\n",
"
3
\n",
"
Elizabeth
\n",
"
F
\n",
"
2549
\n",
"
1884
\n",
"
h
\n",
"
\n",
"
\n",
"
4
\n",
"
Minnie
\n",
"
F
\n",
"
2243
\n",
"
1884
\n",
"
e
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
1891889
\n",
"
Titus
\n",
"
M
\n",
"
5
\n",
"
1883
\n",
"
s
\n",
"
\n",
"
\n",
"
1891890
\n",
"
Toney
\n",
"
M
\n",
"
5
\n",
"
1883
\n",
"
y
\n",
"
\n",
"
\n",
"
1891891
\n",
"
Verna
\n",
"
M
\n",
"
5
\n",
"
1883
\n",
"
a
\n",
"
\n",
"
\n",
"
1891892
\n",
"
Winnie
\n",
"
M
\n",
"
5
\n",
"
1883
\n",
"
e
\n",
"
\n",
"
\n",
"
1891893
\n",
"
Winthrop
\n",
"
M
\n",
"
5
\n",
"
1883
\n",
"
p
\n",
"
\n",
" \n",
"
\n",
"
1891894 rows × 5 columns
\n",
"
"
],
"text/plain": [
" Name Sex Count Year Last\n",
"0 Mary F 9217 1884 y\n",
"1 Anna F 3860 1884 a\n",
"2 Emma F 2587 1884 a\n",
"3 Elizabeth F 2549 1884 h\n",
"4 Minnie F 2243 1884 e\n",
"... ... .. ... ... ...\n",
"1891889 Titus M 5 1883 s\n",
"1891890 Toney M 5 1883 y\n",
"1891891 Verna M 5 1883 a\n",
"1891892 Winnie M 5 1883 e\n",
"1891893 Winthrop M 5 1883 p\n",
"\n",
"[1891894 rows x 5 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"baby['Last'] = names.str[-1]\n",
"baby"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Grouping\n",
"\n",
"\n",
"To compute the sex distribution for each last letter, we need to group by both Last and Sex."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
Count
\n",
"
Year
\n",
"
\n",
"
\n",
"
Last
\n",
"
Sex
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
a
\n",
"
F
\n",
"
58079486
\n",
"
915565667
\n",
"
\n",
"
\n",
"
M
\n",
"
1931630
\n",
"
53566324
\n",
"
\n",
"
\n",
"
b
\n",
"
F
\n",
"
17376
\n",
"
1092953
\n",
"
\n",
"
\n",
"
M
\n",
"
1435939
\n",
"
7658923
\n",
"
\n",
"
\n",
"
c
\n",
"
F
\n",
"
30262
\n",
"
1666288
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Count Year\n",
"Last Sex \n",
"a F 58079486 915565667\n",
" M 1931630 53566324\n",
"b F 17376 1092953\n",
" M 1435939 7658923\n",
"c F 30262 1666288"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Shorthand for baby.groupby(['Last', 'Sex']).agg(np.sum)\n",
"baby.groupby(['Last', 'Sex']).sum().head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice that `Year` is also summed up since each non-grouped column is passed into the aggregation function. To avoid this, we can select out the desired columns before calling `.groupby()`."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
Count
\n",
"
\n",
"
\n",
"
Last
\n",
"
Sex
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
a
\n",
"
F
\n",
"
58079486
\n",
"
\n",
"
\n",
"
M
\n",
"
1931630
\n",
"
\n",
"
\n",
"
b
\n",
"
F
\n",
"
17376
\n",
"
\n",
"
\n",
"
M
\n",
"
1435939
\n",
"
\n",
"
\n",
"
c
\n",
"
F
\n",
"
30262
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Count\n",
"Last Sex \n",
"a F 58079486\n",
" M 1931630\n",
"b F 17376\n",
" M 1435939\n",
"c F 30262"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# When lines get long, you can wrap the entire expression in parentheses\n",
"# and insert newlines before each method call\n",
"letter_dist = (\n",
" baby[['Last', 'Sex', 'Count']]\n",
" .groupby(['Last', 'Sex'])\n",
" .sum()\n",
")\n",
"letter_dist.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plotting\n",
"\n",
"\n",
"`pandas` provides built-in plotting functionality for most basic plots, including bar charts, histograms, line charts, and scatterplots. To make a plot from a DataFrame, use the `.plot` attribute:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# We use the figsize option to make the plot larger\n",
"letter_dist.plot.barh(figsize=(10, 10))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Although this plot shows the distribution of letters and sexes, the male and female bars are difficult to tell apart. By looking at the `pandas` docs on plotting ([link](https://pandas.pydata.org/pandas-docs/stable/visualization.html)) we learn that `pandas` plots one group of bars for row column in the DataFrame, showing one differently colored bar for each column. This means that a pivoted version of the `letter_dist` table will have the right format."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"letter_pivot.plot.barh(figsize=(10, 10))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice that `pandas` conveniently generates a legend for us as well. However, this is still difficult to interpret. We plot the counts for each letter and sex which causes some bars to appear very long and others to be almost invisible. We should instead plot the proportion of male and female babies within each last letter."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
Sex
\n",
"
F
\n",
"
M
\n",
"
F prop
\n",
"
M prop
\n",
"
\n",
"
\n",
"
Last
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
a
\n",
"
58079486
\n",
"
1931630
\n",
"
0.967812
\n",
"
0.032188
\n",
"
\n",
"
\n",
"
b
\n",
"
17376
\n",
"
1435939
\n",
"
0.011956
\n",
"
0.988044
\n",
"
\n",
"
\n",
"
c
\n",
"
30262
\n",
"
1672407
\n",
"
0.017773
\n",
"
0.982227
\n",
"
\n",
"
\n",
"
d
\n",
"
754233
\n",
"
16412640
\n",
"
0.043935
\n",
"
0.956065
\n",
"
\n",
"
\n",
"
e
\n",
"
37421616
\n",
"
14730974
\n",
"
0.717541
\n",
"
0.282459
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"Sex F M F prop M prop\n",
"Last \n",
"a 58079486 1931630 0.967812 0.032188\n",
"b 17376 1435939 0.011956 0.988044\n",
"c 30262 1672407 0.017773 0.982227\n",
"d 754233 16412640 0.043935 0.956065\n",
"e 37421616 14730974 0.717541 0.282459"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"total_for_each_letter = letter_pivot['F'] + letter_pivot['M']\n",
"\n",
"letter_pivot['F prop'] = letter_pivot['F'] / total_for_each_letter\n",
"letter_pivot['M prop'] = letter_pivot['M'] / total_for_each_letter\n",
"letter_pivot.head()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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+cxnsmPHjrzlLW/Jxz72sWzcuDHnnHNO3vGOd2R6ejrvfe97c/bZZ+ejH/1ovva1r0100EomeGYLADgwHHbYYdm4cWOuvvrqfPrTn87rXve6/Oqv/mq2bNmSl7/85UmSBx54IM94xs7l3i9/+cvzh3/4h/nlX/7l3HjjjWO2vijCFgAwuqmpqZx++uk5/fTTs3r16vze7/1envvc5+baa699xNgHH3wwt9xyS5YtW5a77747Rx111AgdL57TiADAqG699db81V/91UPPN2/enOOOOy5f/epXHwpbO3bsyM0335wk+Z3f+Z0cd9xx+chHPpJzzjknO3bsGKXvxTKzBQCM6p577slb3vKWfP3rX89Tn/rU/MAP/EDWrVuXubm5nHfeedm2bVvuv//+vO1tb8tBBx2UD3zgA7n++utz+OGH57TTTstv/MZv5F3vetfYf4xHVa1N5kbts7OzbcOGDWO3AQAHrFtuuSXHHXfc2G1MnD39vVTVxtba7J7GO40IANCRsAUA0JGwBQDQ0eQukN+6KZmfHrsLdje/bewOAGDJGWVmq6o+O0ZdAIChjRK2Wms/NEZdAIChjXIasaruaa0dNkZtAGDpmJqayurVqx96ftlll2VmZma8hp6AyV2zBQBMlJkLrtin329h7Zq9jlm2bFk2b978pGs98MADmZqaetLf54mYqLBVVXNJ5pJkasXKzGxfP3JHfJt9/EMGsD9bTJDgybvyyivzzne+M0cccURuvfXWnHbaabnooovylKc8JYcddljOP//8fPKTn8x73vOeXH/99fngBz+YJHnTm96Ut73tbVlYWMgZZ5yRF77whdm0aVOe/exn58Mf/nCWL1++z3qcqK0fWmvrWmuzrbXZqeWuRASAA919992XE088MSeeeGLOPPPMPY65/vrr8573vCdf+MIX8jd/8zf5+Mc/niS59957c/zxx+e6667LsmXLsn79+lx33XX53Oc+l/e///3ZtGlTkp33Zpybm8tNN92UFStW5KKLLtqnf4aJClsAALv71mnEzZs359JLL93jmFNOOSXHHHNMpqamctZZZ+Waa65JsnO912te85okyTXXXJMzzzwzhx56aA477LC8+tWvztVXX50k+d7v/d685CUvSZL83M/93EOf31eELQBgSauqPT4/5JBDHlqn9Vj3gn60z+8rY2394EpEAGCfuP7663PbbbflwQcfzCWXXJJTTz31EWNOO+20XHbZZfnGN76Re++9N5deemle+tKXJkm+/OUv59prr02SfOQjH9nj558MM1sAwJL24he/OBdccEGOP/74HH300Xtc2/WCF7wgZ599dk455ZS88IUvzJve9KY8//nPT5Icd9xx+dCHPpQTTjghd999d37pl35pn/Y3UVcj7m71qulscCUHAEyMMa6wvOeee/Y6Zvny5bnkkkv2+tnzzz8/559//iPGPeUpT8n73ve+J97kXpjZAgDoaGJntgAA9ub000/P6aef/oQ/PzMzky1btuy7hvbAzBYAQEfCFgBAR8IWAEBHwhYAQEfCFgAwsaoqb3jDGx56fv/992flypV51ateNWJXj4+rEQGAxZmf3sffb9tehxx66KHZsmVL7rvvvixbtiyf+tSnsmrVqidcsrWW1lqe8pTh5pvMbAEAE+0Vr3hFrrjiiiQ7b6dz1lln7XHcxRdfnJ/6qZ/KGWeckWOPPTbvete7kiQLCws57rjjcu655+YFL3hBbr/99vzKr/xKjj/++KxevfqhDVGvvPLKnHbaaTnzzDPznOc8J29+85vz4IMPPun+J3dma+umJ5+gF5GYAYDJ9vrXvz6/9mu/lle96lW56aabcs455+Tqq6/e49jrr78+W7ZsyfLly3PyySdnzZo1OfLII3Prrbdm/fr1ueiii/JHf/RH2bx5c2688cbceeedOfnkk3Paaac99PkvfvGLeeYzn5kzzjgjH//4x/Pa1772SfVvZgsAmGgnnHBCFhYW8pGPfCSvfOUrH3Psy1/+8hxxxBFZtmxZXv3qV+eaa65Jkjzzmc/Mi170oiTJNddck7POOitTU1N5+tOfnh/+4R/O5z//+STJKaeckmOOOSZTU1M566yzHvr8kzG5M1sAALv85E/+ZN7+9rfnyiuvzF133fWo46pqj88PPfTQh15rrT3uzz8Zg81sVdVlVbWxqm6uqrmh6gIAS98555yTd77znVm9evVjjvvUpz6Vu+++O/fdd18uu+yyvOQlL3nEmNNOOy2XXHJJHnjggXz1q1/NVVddlVNOOSXJztOIt912Wx588MFccsklOfXUU59070OeRjyntXZSktkk51XVEQPWBgCWsKOOOipvfetb9zru1FNPzRve8IaceOKJec1rXpPZ2dlHjDnzzDNzwgkn5HnPe15e9rKX5bd+67fy3d/93UmSF7/4xbngggty/PHH5+ijj86ZZ575pHuvx5pK25eqaj7JtzqeSfJPW2ufe9iYuSRzSTK1YuVJR/3S+kF6AwAe6f0/+Yw8/fuOGbuNJMkJR33nXsdcfPHF2bBhQ9773vc+oRpXXnllLrzwwnziE594zHG33HJLjjvuuG97rao2ttYemewy0MxWVZ2e5MeSvLi19rwkm5Ic8vBxrbV1rbXZ1trs1PJ9vJcHAMAIhlogP53ka621b1TVDyZ50UB1AYADxNlnn52zzz77CX/+9NNPz+mnn77P+vmWodZs/fckT62qm5L8epLP7WU8AMB+YZCZrdbaPyZ5xRC1AIB9o2XnrW32xfYH+4snstbdpqYAwB596es7cv83/v4JBYz9UWstd911Vw455BHLzh/TYFcjPl6zs7Ntw4YNY7cBAAesHTt25I477sj27dvHbmViHHLIITnqqKNy0EEHfdvrj3U1oh3kAYA9Ouigg3L00UeP3caS5zQiAEBHwhYAQEfCFgBARxO7QL6q/iHJrWP3waIcmeTOsZtgURyrpcOxWjocq6Wj57F6Zmtt5Z7emOQF8rc+2qp+JktVbXCslgbHaulwrJYOx2rpGOtYOY0IANCRsAUA0NEkh611YzfAojlWS4djtXQ4VkuHY7V0jHKsJnaBPADA/mCSZ7YAAJa8UcNWVZ1RVbdW1V9X1QV7eL+q6nd3vX9TVb1gjD5Z1LH62V3H6Kaq+mxVPW+MPtn7sdpt3MlV9UBVvXbI/vhfFnOsqur0qtpcVTdX1WeG7pGdFvFv4HRV/UlV3bjrWL1xjD5JquqDVfV3VbXlUd4fPlu01kb5SjKV5G+SHJPkO5LcmOQ5DxvzyiT/T5JK8qIk143V74H8tchj9UNJ/smux69wrCb3WO027s+T/N9JXjt23wfi1yJ/rr4zyReTfN+u5981dt8H4tcij9W/TfKbux6vTHJ3ku8Yu/cD8SvJaUlekGTLo7w/eLYYc2brlCR/3Vr729baN5N8NMlPPWzMTyX5cNvpc0m+s6qeMXSj7P1YtdY+21r72q6nn0ty1MA9stNifq6S5C1J/ijJ3w3ZHN9mMcfqZ5J8vLX25SRprTle41jMsWpJDq+qSnJYdoat+4dtkyRprV2VnX//j2bwbDFm2FqV5Pbdnt+x67XHO4b+Hu9x+N+y87cGhrfXY1VVq5KcmeR9A/bFIy3m5+rZSf5JVV1ZVRur6ucH647dLeZYvTfJcUm2JvlCkre21h4cpj0ep8GzxZg7yNceXnv4pZGLGUN/iz4OVfUj2Rm2Tu3aEY9mMcfq/0zyr1trD+z8JZyRLOZYPTXJSUl+NMmyJNdW1edaa/+jd3N8m8Ucq3+aZHOSlyX5/iSfqqqrW2t/37k3Hr/Bs8WYYeuOJN+72/OjsvM3gsc7hv4WdRyq6oQkH0jyitbaXQP1xrdbzLGaTfLRXUHryCSvrKr7W2uXDdIh37LYfwPvbK3dm+TeqroqyfOSCFvDWsyxemOStW3noqC/rqrbkvxgkuuHaZHHYfBsMeZpxM8neVZVHV1V35Hk9Ukuf9iYy5P8/K4rB16UZFtr7StDN8rej1VVfV+Sjyd5g9+6R7XXY9VaO7q1NtNam0nysSTnClqjWMy/gX+c5KVV9dSqWp7khUluGbhPFnesvpydM5CpqqcnOTbJ3w7aJYs1eLYYbWartXZ/Vf2LJJ/Mzis9Pthau7mq3rzr/fdl55VSr0zy10m+kZ2/OTCwRR6rdyY5IslFu2ZM7m9uzDq4RR4rJsBijlVr7Zaq+u9JbkryYJIPtNb2eDk7/Szy5+rXk1xcVV/IztNU/7q1dudoTR/AquojSU5PcmRV3ZHk/0hyUDJetrCDPABAR3aQBwDoSNgCAOhI2AIA6EjYAgDoSNgCAOhI2AIA6EjYAgDoSNgCAOjo/wdbgZ4LAz61swAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"(letter_pivot[['F prop', 'M prop']]\n",
" .sort_values('M prop') # Sorting orders the plotted bars\n",
" .plot.barh(figsize=(10, 10))\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Summary\n",
"\n",
"\n",
"We can see that almost all first names that end in 'p' are male and names that end in 'a' are female! In general, the difference between bar lengths for many letters implies that we can often make a good guess to a person's sex if we just know the last letter of their first name.\n",
"\n",
"We've learned to express the following operations in `pandas`:\n",
"\n",
"| Operation | `pandas` |\n",
"| --------- | ------- |\n",
"| Applying a function elementwise | `series.apply(func)` |\n",
"| String manipulation | `series.str.func()` |\n",
"| Plotting | `df.plot.func()` |"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
},
"toc": {
"nav_menu": {},
"number_sections": false,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": true,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}